﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _19_PLINQ_并行库
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //生成100万个数字存入到List集合中
            List<int> list = Enumerable.Range(1,1000000).ToList();
            //用于计时器
            Stopwatch stopwatch = new Stopwatch();

            #region 没有使用并行库
            /*
            //找出其中的质数
            stopwatch.Start();

            //提示开始计时
            Console.WriteLine("开始计时...");

            //周到符合条件的数量
            int count = 0;

            //使用for循环遍历查找符合条件的数字
            for (int i = 0; i < list.Count; i++)
            {
                if (IsPrime(list[i]))
                {
                    count++;
                }
            }

            //提示结束计时
            Console.WriteLine("结束计时...");
            stopwatch.Stop();
            //输出耗时时间
            Console.WriteLine("没有使用并行库的情况，耗时：" + stopwatch.Elapsed);
            Console.WriteLine("质数的数量是:" + count);

            */

            #endregion


            #region 使用并行库


            //并行是创建多个小线程同时运行，然后将各自的计算结果汇总

            //创建并使用并行库
            stopwatch.Restart();//重置计时器

            int count = list.AsParallel().Where(n=> IsPrime(n)).Count();

            //停止计时
            stopwatch.Stop();

            //输出耗时时间
            Console.WriteLine("没有使用并行库的情况，耗时：" + stopwatch.Elapsed);
            Console.WriteLine("质数的数量是:" + count);


            #endregion

            Console.Read();
        }

        public static bool IsPrime(int number)
        {
            if (number<2) return false;
            //判断是否能被2到number-1之间任意一个整数除
            for (int i = 2; i < number; i++)
            {
                if (number%i==0)//能被整除的情况下，不是质数
                {
                    return false;
                }
            }
            return true;
        }


    }
}
